package com.example.springfeature.init;

import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;

@Component
public class TestInitializingBean implements InitializingBean {
    /**
     * Invoked by the containing {@code BeanFactory} after it has set all bean properties
     * and satisfied {@link BeanFactoryAware}, {@code ApplicationContextAware} etc.
     * <p>This method allows the bean instance to perform validation of its overall
     * configuration and final initialization when all bean properties have been set.
     *
     * @throws Exception in the event of misconfiguration (such as failure to set an
     *                   essential property) or if initialization fails for any other reason
     */
    @Override
    public void afterPropertiesSet() throws Exception {
        System.err.println("ceshi InitializingBean");
    }

    /**
     * 1、Spring为bean提供了两种初始化bean的方式，
     * 实现InitializingBean接口，重写afterPropertiesSet方法，
     * 或者在xml配置文件中通过init-method指定，两种方式可以同时使用。
     *
     * 2、实现InitializingBean接口是直接调用afterPropertiesSet方法，
     * 比通过反射调用init-method指定的方法效率要高一点，
     * 但是init-method方式消除了对spring的依赖
     *
     * --------------------------------------------------------
     * 可以借用Spring种提供的InitializingBean接口，实现 策略工厂模式的工厂初始化
     * 这个接口为Bean提供了属性初始化后的处理方法，
     * 它只包括afterPropertiesSet方法，
     * 凡是继承该接口的类，在bean的属性初始化后都会执行该方法
     */

    public void testDiyInit(){
        System.err.println("ceshi init-method");
    }




}
